home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 226-250 / disk_244 / xcolor / xcolor.s < prev   
Text File  |  1992-05-06  |  24KB  |  1,428 lines

  1.  
  2. *    RF-Tools: XColor V1.2  (7.August.1989)    
  3. *
  4. *    Author : Roger Fischlin
  5. *             Steigerwaldweg
  6. *             D-6450 Hanau 7
  7. *             (West Germay)
  8. *         
  9. *             Telephone : (06181) 650266
  10. *
  11. *      I used the DevPac Assembler V2.0.
  12. *
  13. *    !!  This program is public domain  !! 
  14. *
  15. *
  16. *
  17.  
  18.  
  19.  
  20.     incdir       "vd0:include/"        ; include some files
  21.  
  22.     include    intuition/intuition.i
  23.     include    intuition/intuition_lib.i
  24.             include     exec/memory.i
  25.     include    exec/exec_lib.i
  26.     include    graphics/graphics_lib.i
  27.     include    graphics/text.i
  28.     include    libraries/dos_lib.i
  29.     include    libraries/dos.i
  30.     include    math/mathFFP_lib.i
  31.  
  32. BOX    macro            ; macro to create a border structure
  33.     dc.w    0,0
  34.     dc.b    \5,0,RP_JAM1,5
  35.     dc.l    box_\@,\6
  36. box_\@    dc.w    \1,\2,\3,\2,\3,\4,\1,\4,\1,\2
  37.     endm
  38.  
  39. TEXT    macro            ; macro to create a text structure    
  40.     dc.b    \4,0,RP_JAM1,0
  41.     dc.w    \1,\2
  42.     dc.l    0,\3,0
  43.     endm
  44.  
  45.  
  46.     include    misc/easystart.i    ; include startup code
  47.  
  48. OpenThem    move.w    #$ff,Mode
  49.     lea    dosname(pc),a1        ; open libs
  50.     moveq.l    #0,d0
  51.     CALLEXEC     OpenLibrary
  52.     move.l    d0,_DOSBase    
  53.     lea    intname(pc),a1                 
  54.     moveq.l    #0,d0        
  55.     CALLEXEC     OpenLibrary
  56.     move.l    d0,_IntuitionBase  
  57.     lea    grafname(pc),a1
  58.     moveq.l    #0,d0
  59.     CALLEXEC     OpenLibrary
  60.     move.l    d0,_GfxBase
  61.     lea    Mathname(pc),a1
  62.     moveq.l    #0,d0
  63.     CALLEXEC     OpenLibrary
  64.     move.l    d0,_MathBase
  65.     beq    .exit
  66.     jmp    start
  67.  
  68. .exit    moveq.l    #0,d0
  69.     rts
  70. _DOSBase    dc.l    0
  71. dosname    DOSNAME
  72. _GfxBase    dc.l    0
  73. grafname    GRAFNAME
  74. _IntuitionBase    dc.l    0
  75. intname    INTNAME
  76. _MathBase    dc.l    0
  77. Mathname    FFPNAME
  78.  
  79. start    clr.b    Mode        ; set to normal mode
  80.     move.b    #$ff,OldMode
  81.  
  82.     move.l    _IntuitionBase,a6    ; get pointer to first screen
  83.     lea.l    NewWindow1,a0
  84.     move.l    ib_FirstScreen(a6),nw_Screen(a0)
  85.  
  86.  
  87.     CALLINT    OpenWindow        ; open the window
  88.     tst.l    d0
  89.     beq    NoWindow
  90.     move.l    d0,Window1_Ptr
  91.  
  92.  
  93.     jsr    GetDepth
  94.     jsr    SaveForUndo        ; save color for undo function
  95.  
  96. IN3    jsr    SaveC12        ; get colors 0 &1
  97.  
  98.     lea.l    FONT,a0                ; use Topaz-80 
  99.     CALLGRAF    OpenFont               
  100.     move.l    d0,Font
  101.     move.l    d0,a0
  102.     move.l    Window1_Ptr,a1
  103.     move.l    wd_RPort(a1),a1
  104.     CALLGRAF    SetFont
  105.  
  106.  
  107.  
  108.  
  109.     
  110. IN1    move.l    Window1_Ptr,a1        ; draw border
  111.     move.l    wd_RPort(a1),a0
  112.     lea.l    CG_Box(pc),a1
  113.     move.w    #10,d0
  114.     move.w    #15,d1
  115.     CALLINT    DrawBorder
  116.  
  117.     
  118.  
  119. IN0    lea.l    Gadget0,a0        ; refresh gadgets
  120.     move.l    Window1_Ptr,a1
  121.     sub.l    a2,a2
  122.     CALLINT    RefreshGadgets
  123.  
  124.     clr.l    COLOR        ; current color = 0    
  125.     jsr    GetDepth        ; get depth
  126.     jsr    MakeCG        ; create color gadget
  127. IN2    jsr    NewColor        ; edit new color
  128.     jsr    RGB        ; write R,G,B
  129.  
  130.  
  131.     move.l    Window1_Ptr,a1        ; Clear Window
  132.     move.l    wd_RPort(a1),a1
  133.     move.l    a1,a3
  134.     moveq.l    #0,d0
  135.     CALLGRAF    SetAPen
  136.     move.l    a3,a1
  137.     move.l    #182,d0
  138.     move.l    #13,d1
  139.     move.l    #182+40,d2
  140.     move.l    #128,d3
  141.     CALLGRAF    RectFill
  142.     move.l    a3,a1
  143.     moveq.l    #5,d0
  144.     move.l    #105,d1
  145.     move.l    #227,d2
  146.     move.l    #128,d3
  147.     CALLGRAF    RectFill
  148.  
  149.  
  150. wait    lea.l    Gadget0,a0        ; refresh gadgets again
  151.     move.l    Window1_Ptr,a1
  152.     sub.l    a2,a2
  153.     CALLINT    RefreshGadgets
  154.  
  155.     moveq.l    #0,d0
  156.     move.b    Mode,d0
  157.     cmp.b    OldMode,d0
  158.     beq    wait2
  159.     move.b    d0,OldMode
  160.     mulu    #25,d0
  161.     add.l    #Title0,d0
  162.     move.l    d0,a1
  163.     sub.l    a2,a2
  164.     move.l    Window1_Ptr,a0
  165.     CALLINT    SetWindowTitles
  166.  
  167. wait2    move.l    Window1_Ptr,a0        ; wait .....
  168.     move.l    wd_UserPort(a0),a0
  169.     move.l    a0,a5
  170.     CALLEXEC    WaitPort        
  171.     move.l    a5,a0
  172.     CALLEXEC    GetMsg        ; get message
  173.     move.l    d0,a1    
  174.     move.l    im_Class(a1),d4    ; get data
  175.     move.w    im_Code(a1),d5
  176.     move.l    im_IAddress(a1),a4
  177.     move.w    im_MouseX(a1),d6
  178.     move.w    im_MouseY(a1),d7
  179.     CALLEXEC     ReplyMsg        ; reply message        
  180.     cmp.l    #CLOSEWINDOW,d4
  181.     beq    QUIT
  182.     cmp.l    #MENUPICK,d4
  183.     beq    Size
  184.     
  185.     cmp.l    #GADGETDOWN,d4
  186.     beq    G1_HandlerA
  187.     
  188.     cmp.l    #VANILLAKEY,d4
  189.     beq    Key
  190.     moveq.l    #0,d0        
  191.     move.w    gg_GadgetID(a4),d0    
  192.     tst.w    d0
  193.     beq    G0_Handler
  194.     cmp.w    #3,d0
  195.     bls    G1_HandlerB
  196.     cmp.w    #7,d0    
  197.     beq    UNDO
  198.     cmp.w    #9,d0    
  199.     beq    SUB
  200.     cmp.w    #8,d0    
  201.     beq    ADD
  202.     cmp.w    #4,d0
  203.     beq    ChangeScreen
  204.     cmp.b    #10,d0
  205.     beq    Black_White
  206.     cmp.b    #5,d0
  207.     beq    UNDO_ALL
  208.     cmp.b    #11,d0
  209.     beq    ANTIK
  210.     cmp.b    #12,d0
  211.     beq    COPY
  212.     cmp.b    #13,d0
  213.     beq    EXCHANGE
  214.     cmp.b    #14,d0
  215.     beq    SPREAD
  216.     
  217.  
  218.     bra    wait    
  219.  
  220. Key    cmp.b    #" ",d5
  221.     beq    XColors
  222.     cmp.b    #27,d5
  223.     beq    XColorsBack
  224.     bra    wait    
  225.  
  226.  
  227.  
  228. QUIT    move.l    Window1_Ptr,a0        ; the exit
  229.     CALLINT    CloseWindow
  230.     moveq.l    #0,d0
  231.  
  232.     move.l    _MathBase,a1
  233.     CALLEXEC    CloseLibrary
  234.     moveq.l    #0,d0
  235.     rts
  236.  
  237.  
  238.  
  239.  
  240.  
  241. MakeCG    move.l    Depth,d0        ; get size of block
  242.     subq    #1,d0        ; from table and draw
  243.     lsl.l    #2,d0        ; the blocks
  244.     lea.l    SizeTable,a0
  245.     move.w    (a0,d0),d6
  246.     move.w    2(a0,d0),d7
  247.     moveq.l    #0,d5
  248.     move.w    #0,-(sp)
  249.  
  250.  
  251. MCG0    moveq.l    #0,d4
  252.  
  253. MCG1    move.w    (sp),d0
  254.     move.l    Window1_Ptr,a1
  255.     move.l    wd_RPort(a1),a1
  256.     move.l    a1,a3
  257.     CALLGRAF    SetAPen
  258.     move.l    a3,a1
  259.     move.w    d4,d0
  260.     move.w    d5,d1
  261.     add.w    d6,d4
  262.     move.w    d4,d2
  263.     move.w    d5,d3
  264.     add.w    d7,d3
  265.     add    #10,d0
  266.     add    #15,d1
  267.     add    #10,d2
  268.     add    #15,d3
  269.     CALLGRAF    RectFill
  270.     add.w    #1,(sp)
  271.     cmp.w    #159,d4
  272.     bls    MCG1
  273. MCG2    add.w    d7,d5
  274.     cmp.w    #39,d5
  275.     bls    MCG0
  276.     lea.l    2(sp),sp
  277.     rts    
  278.     
  279. Depth    dc.l    0
  280. SizeTable    dc.w    160/2,40/1    ; 2   colors
  281.     dc.w    160/2,40/2    ; 4   colors
  282.     dc.w    160/4,40/2    ; 8   colors
  283.     dc.w    160/4,40/4    ; 16  colors
  284.     dc.w    160/8,40/4    ; 32  colors
  285.     dc.w    160/16,40/4    ; 64  colors    
  286.     
  287.     
  288. Gadget0    dc.l    Gadget1
  289.     dc.w    10,15,160,40
  290.     dc.w    GADGHNONE
  291.     dc.w    RELVERIFY
  292.     dc.w    BOOLGADGET
  293.     dc.l    0,0
  294.     dc.l    0
  295.     dc.l    0,0
  296.     dc.w    0
  297.     dc.l    0
  298.  
  299.  
  300. Gadget1    dc.l    Gadget2
  301.     dc.w    40+10,50+15,114,11
  302.     dc.w    GADGHCOMP
  303.     dc.w    RELVERIFY!GADGIMMEDIATE
  304.     dc.w    PROPGADGET
  305.     dc.l    G1_image,0
  306.     dc.l    0
  307.      dc.l    0,G1_info
  308.     dc.w    1
  309.     dc.l    0
  310. G1_image    ds.w    4
  311. G1_info    dc.w    FREEHORIZ!AUTOKNOB
  312.     dc.w    0
  313.     dc.w    0
  314.     dc.w    $ffff/15
  315.     ds.w    7
  316. Gadget2    dc.l    Gadget3
  317.     dc.w    40+10,50+30,114,11
  318.     dc.w    GADGHCOMP
  319.     dc.w    RELVERIFY!GADGIMMEDIATE
  320.     dc.w    PROPGADGET
  321.     dc.l    G2_image,0
  322.     dc.l    0
  323.     dc.l    0,G2_info
  324.     dc.w    2
  325.     dc.l    0
  326. G2_image    ds.w    4
  327. G2_info    dc.w    FREEHORIZ!AUTOKNOB
  328.     dc.w    0
  329.     dc.w    0
  330.     dc.w    $ffff/15
  331.     ds.w    7
  332. Gadget3    dc.l    Gadget4
  333.     dc.w    40+10,50+45,114,11
  334.     dc.w    GADGHCOMP
  335.     dc.w    RELVERIFY!GADGIMMEDIATE
  336.     dc.w    PROPGADGET
  337.     dc.l    G3_image,0
  338.     dc.l    0
  339.     dc.l    0,G3_info
  340.     dc.w    3
  341.     dc.l    0
  342.  
  343. G3_image    ds.w    4
  344. G3_info    dc.w    FREEHORIZ!AUTOKNOB
  345.     dc.w    0
  346.     dc.w    0
  347.     dc.w    $ffff/15
  348.     ds.w    7
  349.  
  350.  
  351. Gadget4    dc.l    Gadget5
  352.     dc.w    5,115,10*8,10
  353.     dc.w    GADGHCOMP
  354.     dc.w    RELVERIFY
  355.     dc.w    BOOLGADGET
  356.     dc.l    G4_box,0
  357.     dc.l    G4_text
  358.     dc.l    0,0
  359.     dc.w    4
  360.     dc.l    0
  361. G4_box    BOX    -1,-1,80,10,1,0
  362. G4_text    TEXT    16,1,G4_string,1
  363. G4_string    dc.b    "SCREEN",0
  364. Gadget5    dc.l    Gadget7
  365.     dc.w    95,115,10*8,10
  366.     dc.w    GADGHCOMP
  367.     dc.w    RELVERIFY
  368.     dc.w    BOOLGADGET
  369.     dc.l    G5_box,0
  370.     dc.l    G5_text
  371.     dc.l    0,0
  372.     dc.w    5
  373.     dc.l    0
  374. G5_box    BOX    -1,-1,80,10,1,0
  375. G5_text    TEXT    8,1,G5_string,1
  376. G5_string    dc.b    "Undo All",0
  377.  
  378. Gadget7    dc.l    Gadget8
  379.     dc.w    11,66,20,30
  380.     dc.w    GADGHBOX
  381.     dc.w    RELVERIFY
  382.     dc.w    BOOLGADGET
  383.     dc.l    C_Box,0
  384.     dc.l    0
  385.     dc.l    0,0
  386.     dc.w    7
  387.     dc.l    0
  388. Gadget8    dc.l    Gadget9
  389.     dc.w    185,15,36,10
  390.     dc.w    GADGHCOMP
  391.     dc.w    RELVERIFY
  392.     dc.w    BOOLGADGET
  393.     dc.l    G8_box,0
  394.     dc.l    G8_text
  395.     dc.l    0,0
  396.     dc.w    8
  397.     dc.l    0
  398. G8_box    BOX    -1,-1,36,10,1,0
  399. G8_text    TEXT    6,1,G8_string,1
  400. G8_string    dc.b    "ADD",0
  401. Gadget9    dc.l    Gadget10
  402.     dc.w    185,30,36,10
  403.     dc.w    GADGHCOMP
  404.     dc.w    RELVERIFY
  405.     dc.w    BOOLGADGET
  406.     dc.l    G8_box,0
  407.     dc.l    G9_text
  408.     dc.l    0,0
  409.     dc.w    9
  410.     dc.l    0
  411. G9_text    TEXT    6,1,G9_string,1
  412. G9_string    dc.b    "SUB",0
  413.  
  414. Gadget10    dc.l    Gadget11
  415.     dc.w    185,50,36,10
  416.     dc.w    GADGHCOMP
  417.     dc.w    RELVERIFY
  418.     dc.w    BOOLGADGET
  419.     dc.l    G8_box,0
  420.     dc.l    G10_text
  421.     dc.l    0,0
  422.     dc.w    10
  423.     dc.l    0
  424. G10_text    TEXT    6,1,G10_string,1
  425. G10_string    dc.b    "B&W",0
  426. Gadget11    dc.l    Gadget12
  427.     dc.w    185,65,36,10
  428.     dc.w    GADGHCOMP
  429.     dc.w    RELVERIFY
  430.     dc.w    BOOLGADGET
  431.     dc.l    G8_box,0
  432.     dc.l    G11_text
  433.     dc.l    0,0
  434.     dc.w    11
  435.     dc.l    0
  436. G11_text    TEXT    4,1,G11_string,1
  437. G11_string    dc.b    "ANT.",0
  438. Gadget12    dc.l    Gadget13
  439.     dc.w    185,85,36,10
  440.     dc.w    GADGHCOMP
  441.     dc.w    RELVERIFY
  442.     dc.w    BOOLGADGET
  443.     dc.l    G8_box,0
  444.     dc.l    G12_text
  445.     dc.l    0,0
  446.     dc.w    12
  447.     dc.l    0
  448. G12_text    TEXT    1,1,G12_string,1
  449. G12_string    dc.b    "COPY",0
  450. Gadget13    dc.l    Gadget14
  451.     dc.w    185,100,36,10
  452.     dc.w    GADGHCOMP
  453.     dc.w    RELVERIFY
  454.     dc.w    BOOLGADGET
  455.     dc.l    G8_box,0
  456.     dc.l    G13_text
  457.     dc.l    0,0
  458.     dc.w    13
  459.     dc.l    0
  460. G13_text    TEXT    8,1,G13_string,1
  461. G13_string    dc.b    "EX.",0
  462. Gadget14    dc.l    0    Gadget14
  463.     dc.w    185,115,36,10
  464.     dc.w    GADGHCOMP
  465.     dc.w    RELVERIFY
  466.     dc.w    BOOLGADGET
  467.     dc.l    G8_box,0
  468.     dc.l    G14_text
  469.     dc.l    0,0
  470.     dc.w    14
  471.     dc.l    0
  472. G14_text    TEXT    4,1,G14_string,1
  473. G14_string    dc.b    "SPR.",0
  474.  
  475.  
  476.  
  477.  
  478. Font    dc.l    0
  479. FONT    dc.l    fontname
  480.     dc.w    TOPAZ_EIGHTY
  481.     dc.b    FS_NORMAL
  482.     dc.b    FPF_ROMFONT
  483.     even
  484. fontname    dc.b    "topaz.font",0 
  485.  
  486.  
  487.  
  488. NewWindow1    dc.w    10,10
  489.     dc.w    232,130
  490.     dc.b    -1,-1
  491.     dc.l    CLOSEWINDOW!GADGETUP!GADGETDOWN!MENUPICK!VANILLAKEY
  492.     dc.l    WINDOWCLOSE!WINDOWDRAG!WINDOWDEPTH!ACTIVATE!SMART_REFRESH
  493.     dc.l    Gadget0
  494.     dc.l    0
  495.     dc.l    0
  496. CScreen    dc.l    0
  497.     dc.l    0
  498.     dc.w    140,100
  499.     dc.w    140,100
  500.     dc.w    CUSTOMSCREEN
  501.  
  502. Window1_Ptr    dc.l    0        ; window pointer
  503. Undo    dc.w    0        ; undo
  504. CG_Box    BOX    -1,-1,161,41,1,0
  505. C_Box    BOX    -1,-1,20,30,1,0
  506.  
  507. COLOR    dc.l    0        ; current color
  508. MoverSize    dc.w    0        ; size of mover ($ffff/15 or $ffff/7)
  509.  
  510. NewColor    move.w    #$ffff/15,d0        ; edit a new color 
  511.     cmp.l    #$1f,COLOR        ; color is halfbrite ( >$1f) => mover is smaller !
  512.     bls    NC0
  513.     move.w    #$ffff/7,d0
  514. NC0    move.w    d0,MoverSize
  515.     
  516.  
  517.     move.l    Window1_Ptr,a1        ; write color number
  518.     move.l    wd_RPort(a1),a1
  519.     move.l    a1,a2
  520.     moveq.l    #1,d0
  521.     CALLGRAF    SetAPen
  522.  
  523.     move.l    a2,a1    
  524.     move.w    #12,d0
  525.     move.w    #50+15+6+1+15+15+2,d1
  526.     CALLGRAF    Move    
  527.  
  528.     lea.l    Zahlen2,a0
  529.     move.l    COLOR,d0
  530.     add.l    d0,d0
  531.     add.l    d0,a0
  532.     moveq.l    #2,d0
  533.     CALLGRAF    Text
  534.  
  535.  
  536.     move.l    Window1_Ptr,a0        ; get RGB and save for undo !
  537.     CALLINT    ViewPortAddress
  538.     move.l    d0,a0
  539.     move.l    vp_ColorMap(a0),a0
  540.     move.l    COLOR,d0
  541.     bsr    GET
  542.     move.w    d0,Undo
  543.     move.w    d0,-(sp)        ; remake prop-gadgets
  544.     lsr.w    #8,d0
  545.     and.w    #$f,d0
  546.     moveq.l    #0,d1
  547.     move.b    d0,d1
  548.     mulu.w    MoverSize,d1
  549.     lea.l    Gadget1,a0
  550.     move.l    Window1_Ptr,a1
  551.     sub.l    a2,a2
  552.     moveq.l    #0,d2
  553.     move.w    MoverSize,d3
  554.     moveq.l    #0,d4
  555.     move.w    #FREEHORIZ!AUTOKNOB,d0
  556.     CALLINT    ModifyProp
  557.     
  558.     moveq.l    #0,d1
  559.     move.w    (sp),d1
  560.     lsr.w    #4,d1
  561.     and.w    #$f,d1
  562.     mulu.w    MoverSize,d1
  563.     lea.l    Gadget2,a0
  564.     move.l    Window1_Ptr,a1
  565.     sub.l    a2,a2
  566.     moveq.l    #0,d2
  567.     move.w    MoverSize,d3
  568.     moveq.l    #0,d4
  569.     move.w    #FREEHORIZ!AUTOKNOB,d0
  570.     CALLINT    ModifyProp
  571.  
  572.     moveq.l    #0,d1
  573.     move.w    (sp)+,d1
  574.     and.w    #$f,d1
  575.     mulu.w    MoverSize,d1
  576.     lea.l    Gadget3,a0
  577.     move.l    Window1_Ptr,a1
  578.     sub.l    a2,a2
  579.     moveq.l    #0,d2
  580.     move.w    MoverSize,d3
  581.     moveq.l    #0,d4
  582.     move.w    #FREEHORIZ!AUTOKNOB,d0
  583.     CALLINT    ModifyProp
  584.  
  585.     move.l    Window1_Ptr,a1        ; draw block for undo gadget
  586.     move.l    wd_RPort(a1),a1
  587.     move.l    COLOR,d0
  588.     CALLGRAF    SetAPen
  589.     move.l    Window1_Ptr,a1
  590.     move.l    wd_RPort(a1),a1
  591.     move.w    #10+1,d0    
  592.     move.w    #15+50+1,d1
  593.     move.w    #10+19+1,d2    
  594.     move.w    #15+50+29+1,d3
  595.     CALLGRAF    RectFill
  596.     jmp    HEX        ; write mover positions as numbers
  597.  
  598. G0_Handler    cmp.b    #1,Mode        
  599.     beq    Copy_Color
  600.     cmp.b    #2,Mode
  601.     beq    Exchange_Color
  602.     cmp.b    #3,Mode
  603.     beq    Spread_Color
  604.  
  605.  
  606.     move.w    d6,d0        ; color gadget was selected but 
  607.     move.w    d7,d1        ; which color ?
  608.     move.l    Window1_Ptr,a1
  609.     move.l    wd_RPort(a1),a1
  610.     CALLGRAF    ReadPixel
  611.     move.l    d0,COLOR
  612.     jsr    NewColor        
  613.     bra    wait
  614.  
  615. Zahlen    dc.b    "0123456789ABCDEF"
  616. Zahlen2    dc.b    "000102030405060708090a0b0c0d0e0f"
  617.     dc.b    "101112131415161718191a1b1c1d1e1f"
  618.     dc.b    "202122232425262728292a2b2c2d2e2f"
  619.     dc.b    "303132333435363738393a3b3c3d3e3f"
  620.     
  621. HEX    move.l    Window1_Ptr,a0        ; write mover position as hex number
  622.     CALLINT    ViewPortAddress
  623.     move.l    d0,a0
  624.     move.l    vp_ColorMap(a0),a0
  625.     move.l    COLOR,d0
  626.     bsr    GET
  627.     move.w    d0,d5
  628.  
  629.     move.l    Window1_Ptr,a1
  630.     move.l    wd_RPort(a1),a1
  631.     move.l    a1,a2
  632.     moveq.l    #1,d0
  633.     CALLGRAF    SetAPen
  634.  
  635.     move.l    a2,a1    
  636.     move.w    #114+50+4,d0
  637.     move.w    #50+15+6+2,d1
  638.     CALLGRAF    Move    
  639.  
  640.     lea.l    Zahlen,a0
  641.     move.l    d5,d0
  642.     lsr.l    #8,d0
  643.     and.l    #$f,d0    
  644.     add.l    d0,a0
  645.     moveq.l    #1,d0
  646.     CALLGRAF    Text
  647.  
  648.     move.l    a2,a1    
  649.     move.w    #114+50+4,d0
  650.     move.w    #50+15+6+15+2,d1
  651.     CALLGRAF    Move    
  652.  
  653.     lea.l    Zahlen,a0
  654.     move.l    d5,d0
  655.     lsr.l    #4,d0
  656.     and.l    #$f,d0
  657.     add.l    d0,a0
  658.     moveq.l    #1,d0
  659.     CALLGRAF    Text
  660.  
  661.     move.l    a2,a1    
  662.     move.w    #114+50+4,d0
  663.     move.w    #50+15+6+15+15+2,d1
  664.     CALLGRAF    Move    
  665.  
  666.     lea.l    Zahlen,a0
  667.     and.l    #$f,d5    
  668.     add.l    d5,a0
  669.     moveq.l    #1,d0
  670.     CALLGRAF    Text
  671.     rts
  672. G1_HandlerA    jsr    ReadColor        ; prop gadget was selected
  673.     jsr    HEX
  674.     move.l    Window1_Ptr,a0        
  675.     move.l    wd_UserPort(a0),a0
  676.     CALLEXEC    GetMsg
  677.     tst.l    d0
  678.     beq    G1_HandlerA
  679.     move.l    d0,a1    
  680.     CALLEXEC     ReplyMsg
  681. G1_HandlerB    jsr    ReadColor        ;  " (but left button was released afterwards)
  682.     jsr    HEX
  683.     bra    wait
  684.  
  685. ReadColor    move.l    Window1_Ptr,a0        ; get mover position and set RGB 
  686.     CALLINT    ViewPortAddress
  687.     move.l    d0,a0
  688.     moveq.l    #0,d1
  689.     moveq.l    #0,d2
  690.     moveq.l    #0,d3
  691.     
  692.     move.w    G1_info+2,d1
  693.     divu    G1_info+6,d1
  694.     move.w    G2_info+2,d2
  695.     divu    G2_info+6,d2
  696.     move.w    G3_info+2,d3
  697.     divu    G3_info+6,d3
  698.     move.l    COLOR,d0
  699.     bsr    SET
  700.     rts
  701. UNDO    move.l    Window1_Ptr,a0        ; undo color
  702.     CALLINT    ViewPortAddress
  703.     move.l    d0,a0
  704.     move.l    COLOR,d0
  705.     move.w    Undo,d1
  706.     move.w    d1,d2
  707.     move.w    d2,d3
  708.     lsr.w    #8,d1
  709.     and.l    #$f,d1
  710.     lsr.w    #4,d2
  711.     and.l    #$f,d2
  712.     and.l    #$f,d3        
  713.     bsr    SET
  714.     jsr    NewColor
  715.     bra    wait
  716. GetDepth    move.l    CScreen,a0        ; get depth (HAM=4!)
  717.     lea.l    sc_BitMap(a0),a0
  718.     moveq.l    #0,d0
  719.     move.b    bm_Depth(a0),d0
  720.     move.l    CScreen,a0
  721.     lea.l    sc_ViewPort(a0),a0
  722.     move.w    vp_Modes(a0),d1
  723.     and.w    #$800,d1
  724.     beq    GD1
  725.     moveq.l    #4,d0
  726. GD1    move.l    d0,Depth
  727.     rts
  728. SUB    CALLEXEC    Forbid        ; sub Bitplane
  729.     move.l    CScreen,a0
  730.     lea.l    sc_ViewPort(a0),a1        
  731.     move.w    vp_Modes(a1),d0
  732.     and.l    #$800,d0        ; HAM ?
  733.     bne    SUB1
  734.     
  735.     lea.l    sc_BitMap(a0),a0
  736.     moveq.l    #0,d2
  737.     move.b    bm_Depth(a0),d2            
  738.     cmp.b    #1,d2        ; depth =1 ?
  739.     bls    SUB1
  740.     sub.b    #1,bm_Depth(a0)
  741.     subq    #1,d2
  742.     lsl.l    #2,d2
  743.     add.l    #bm_Planes,d2
  744.     moveq.l    #0,d0
  745.     moveq.l    #0,d1
  746.     move.w    bm_BytesPerRow(a0),d0
  747.     lsl.l    #3,d0
  748.     move.w    bm_Rows(a0),d1
  749.     move.l    (a0,d2),a0
  750.     CALLGRAF    FreeRaster        ; free memory
  751.     
  752.  
  753.     move.l    CScreen,a0
  754.     lea.l    sc_ViewPort(a0),a1
  755.     lea.l    sc_BitMap(a0),a0
  756.     cmp.b    #5,bm_Depth(a0)
  757.     bne    SUB2
  758.     and.w    #$ffff-$80,vp_Modes(a1)    ; clear EHB flag !
  759.  
  760. SUB2    CALLINT    RemakeDisplay
  761.     CALLEXEC    Permit
  762.     bra    IN0
  763. SUB1    CALLEXEC    Permit        ; cannot sub bitplane
  764.     sub.l    a0,a0
  765.     CALLINT    DisplayBeep
  766.     bra    wait
  767.     
  768.  
  769. ADD    CALLEXEC    Forbid        ; add bitplane
  770.     move.l    CScreen,a0
  771.     lea.l    sc_BitMap(a0),a0
  772.     moveq.l    #0,d2
  773.     move.b    bm_Depth(a0),d2            
  774.     cmp.b    #5,d2        ; depth = 6 ?
  775.     bhi    ADD1
  776.     move.l    CScreen,a1
  777.     lea.l    sc_ViewPort(a1),a1
  778.     move.w    vp_Modes(a1),d0
  779.     and.l    #$8000,d0        ; HIRES (x=640) ?
  780.     beq    ADD2
  781.     move.b    bm_Depth(a0),d2            
  782.     cmp.b    #3,d2
  783.     bhi    ADD1
  784. ADD2    moveq.l    #0,d0
  785.     moveq.l    #0,d1
  786.     move.w    bm_BytesPerRow(a0),d0
  787.     lsl.l    #3,d0
  788.     move.w    bm_Rows(a0),d1
  789.     
  790.     CALLGRAF    AllocRaster        ; get memory ?
  791.     tst.l    d0
  792.     beq    ADD1
  793.     move.l    CScreen,a0
  794.     lea.l    sc_BitMap(a0),a0
  795.     moveq.l    #0,d2
  796.     move.b    bm_Depth(a0),d2
  797.     add.b    #1,bm_Depth(a0)
  798.     lsl.l    #2,d2
  799.     add.l    #bm_Planes,d2
  800.     move.l    d0,(a0,d2)
  801.  
  802.     move.l    d0,a1
  803.     move.l    (a0),d0
  804.     swap    d0
  805.     moveq.l    #3,d1
  806.     CALLGRAF    BltClear        ; clear bitplane
  807.  
  808.     move.l    CScreen,a0
  809.     lea.l    sc_BitMap(a0),a0
  810.     cmp.b    #6,bm_Depth(a0)
  811.     bne    ADD3
  812.     move.l    CScreen,a1
  813.     lea.l    sc_ViewPort(a1),a1
  814.     or.w    #$80,vp_Modes(a1)    ; depth =6 => set EHB flag !
  815.  
  816. ADD3    CALLINT    RemakeDisplay
  817.     CALLEXEC    Permit
  818.     bra    IN0
  819. ADD1    CALLEXEC    Permit        ; cannot add bitplane
  820.     sub.l    a0,a0
  821.     CALLINT    DisplayBeep
  822.     bra    wait
  823.  
  824. Size    CALLEXEC    Forbid        
  825.     move.l    Window1_Ptr,a0
  826.     cmp.w    #20,wd_Height(a0)
  827.     bls    MakeBig        ;  stretch window to normal size  
  828.     moveq.l    #0,d0
  829.     move.w    #10,d1
  830.     sub.w    wd_Height(a0),d1
  831.     CALLINT    SizeWindow
  832.     CALLEXEC    Permit
  833.     moveq.l    #0,d0
  834.     move.b    #0,Mode
  835.     move.b    Mode,d0
  836.     cmp.b    OldMode,d0
  837.     beq    wait2
  838.     move.b    d0,OldMode
  839.     mulu    #25,d0
  840.     add.l    #Title0,d0
  841.     move.l    d0,a1
  842.     sub.l    a2,a2
  843.     move.l    Window1_Ptr,a0
  844.     CALLINT    SetWindowTitles
  845.     bra    wait
  846. MakeBig    move.l    Window1_Ptr,a0        ;crunch window to min. size
  847.     moveq.l    #0,d0
  848.     move.w    wd_TopEdge(a0),d1
  849.     neg.w    d1
  850.     CALLINT    MoveWindow        ; move window to top (to have enough room)
  851.     move.l    Window1_Ptr,a0
  852.     moveq.l    #0,d0
  853.     move.w    #120,d1
  854.     CALLINT    SizeWindow        ; resize window
  855.     CALLEXEC    Permit
  856.     move.l    #10,d1        ; Intuition needs time to understand it 
  857.     CALLDOS    Delay        ; (don't ask me why !)
  858.     move.l    Window1_Ptr,a0
  859.     CALLINT    WindowToFront
  860.  
  861.     bra    IN1
  862.  
  863. ChangeScreen    move.l    Window1_Ptr,a0        ; re-open window on first screen
  864.     CALLINT    CloseWindow
  865.     jmp    start
  866.  
  867. SET    cmp.b    #$1f,d0        ; set RGB (special routine for EHB-mode!)
  868.     bls    SET1
  869.     and.w    #$1f,d0
  870.     lsl    #1,d1
  871.     lsl    #1,d2
  872.     lsl    #1,d3
  873. SET1    CALLGRAF    SetRGB4
  874.     rts
  875.  
  876. GET    move.l    d0,-(sp)        ; get RGB (special routine for EHB-mode!)
  877.     and.l    #$1f,d0
  878.     CALLGRAF    GetRGB4
  879.      cmp.l    #$1f,(sp)
  880.     bls    GET1
  881.     lsr.w    #1,d0
  882.     and.l    #$777,d0
  883. GET1    tst.l    (sp)+
  884.     rts
  885.  
  886. R    dc.b    "R"
  887. G    dc.b    "G"
  888. B    dc.b    "B"
  889.  
  890.  
  891. RGB    move.l    Window1_Ptr,a1        ; print out R, G , B
  892.     move.l    wd_RPort(a1),a1
  893.     move.l    a1,a2
  894.     moveq.l    #1,d0
  895.     CALLGRAF    SetAPen
  896.  
  897.     move.l    a2,a1    
  898.     move.w    #40,d0
  899.     move.w    #50+15+6+2,d1
  900.     CALLGRAF    Move    
  901.  
  902.     lea.l    R,a0
  903.     moveq.l    #1,d0
  904.     CALLGRAF    Text
  905.  
  906.     move.l    a2,a1    
  907.     move.w    #40,d0
  908.     move.w    #50+15+6+15+2,d1
  909.     CALLGRAF    Move    
  910.  
  911.     lea.l    G,a0
  912.     moveq.l    #1,d0
  913.     CALLGRAF    Text
  914.  
  915.     move.l    a2,a1    
  916.     move.w    #40,d0
  917.     move.w    #50+15+6+15+15+2,d1
  918.     CALLGRAF    Move    
  919.  
  920.     lea.l    B,a0
  921.     moveq.l    #1,d0
  922.     CALLGRAF    Text
  923.     rts    
  924.  
  925. C1    dc.w    0
  926. C2    dc.w    0
  927.  
  928. SaveC12    move.l    Window1_Ptr,a0        ; save color 0 &1
  929.     CALLINT    ViewPortAddress
  930.     move.l    d0,a0
  931.     move.l    vp_ColorMap(a0),a0
  932.     moveq.l    #0,d0
  933.     bsr    GET
  934.     move.w    d0,C1
  935.     move.l    Window1_Ptr,a0
  936.     CALLINT    ViewPortAddress
  937.     move.l    d0,a0
  938.     move.l    vp_ColorMap(a0),a0
  939.     moveq.l    #1,d0
  940.     bsr    GET
  941.     move.w    d0,C2
  942.     rts
  943.  
  944. XColors    move.l    Window1_Ptr,a0        ; set color 0 & 1 to black and white
  945.     CALLINT    ViewPortAddress
  946.     move.l    d0,a0
  947.     moveq.l    #0,d0    
  948.     moveq.l    #0,d1
  949.     moveq.l    #0,d2    
  950.     moveq.l    #0,d3
  951.     bsr    SET
  952.     move.l    Window1_Ptr,a0
  953.     CALLINT    ViewPortAddress
  954.     move.l    d0,a0
  955.     moveq.l    #1,d0    
  956.     move.b    #$e,d1
  957.     move.b    #$e,d2    
  958.     move.b    #$e,d3
  959.     bsr    SET
  960.     jsr    NewColor
  961.     bra    wait
  962.  
  963. XColorsBack    move.l    Window1_Ptr,a0        ; use old colors 
  964.     CALLINT    ViewPortAddress
  965.     move.l    d0,a0
  966.     moveq.l    #0,d0    
  967.     move.w    C1,d1
  968.     move.w    d1,d2
  969.     move.w    d2,d3
  970.     and.w    #$f,d3
  971.     lsr.w    #4,d2
  972.     and.w    #$f,d2
  973.     lsr.w    #8,d1
  974.     and.w    #$f,d1
  975.     bsr    SET
  976.     move.l    Window1_Ptr,a0
  977.     CALLINT    ViewPortAddress
  978.     move.l    d0,a0
  979.     moveq.l    #1,d0    
  980.     move.w    C2,d1
  981.     move.w    d1,d2
  982.     move.w    d2,d3
  983.     and.w    #$f,d3
  984.     lsr.w    #4,d2
  985.     and.w    #$f,d2
  986.     lsr.w    #8,d1
  987.     and.w    #$f,d1
  988.     bsr    SET
  989.     jsr    NewColor
  990.     bra    wait
  991.  
  992.  
  993. NoWindow    move.l    #RECOVERY_ALERT,d0    ; error message
  994.     move.l    #30,d1
  995.     lea.l    ErrorText,a0
  996.     CALLINT    DisplayAlert
  997.     move.l    _MathBase,a1
  998.     CALLEXEC    CloseLibrary
  999.     moveq.l    #0,d0
  1000.     rts
  1001.  
  1002. ErrorText    dc.w    99
  1003.     dc.b    17
  1004.     dc.b    "XColor   :   ERROR !?!    I cannot open the window !"
  1005.     dc.b     0,0 
  1006.  
  1007.     even
  1008. ColorBuffer    ds.w    64
  1009. UNDOBuffer    ds.w    64
  1010. UNDODepth    dc.l    0
  1011.  
  1012. * How to make B&W
  1013. *
  1014. * C=r+g+b    ; add all three parts red, green, blue
  1015. * r=g=b=C/3  ; new parts
  1016.  
  1017. Black_White    move.l    Window1_Ptr,a0        
  1018.     CALLINT    ViewPortAddress
  1019.     move.l    d0,a0
  1020.     move.l    Depth,d0        ; copy colors to buffer
  1021.     moveq.l    #0,d1
  1022.     bset    d0,d1
  1023.     subq    #1,d1
  1024.     
  1025.     move.l    vp_ColorMap(a0),a0
  1026.     move.l    cm_ColorTable(a0),a0
  1027.     lea.l    ColorBuffer(pc),a1
  1028. .X    move.w    (a0)+,(a1)+
  1029.     dbra    d1,.X
  1030.     
  1031.     move.l    Depth,d0        ; convert colors to b&W
  1032.     moveq.l    #0,d1
  1033.     bset    d0,d1
  1034.     subq    #1,d1
  1035.     lea.l    ColorBuffer(pc),a1
  1036. .Y    moveq.l    #0,d0
  1037.     add.b    (a1),d0
  1038.     moveq.l    #0,d2
  1039.     move.b    1(a1),d2
  1040.     move.b    d2,d3
  1041.     and.b    #$f,d3
  1042.     lsr.b    #4,d2
  1043.     add.b    d2,d0
  1044.     add.b    d3,d0
  1045.     and.l    #$ff,d0
  1046.     divu    #3,d0
  1047.     move.b    d0,(a1)+
  1048.     move.b    d0,d2
  1049.     lsl.b    #4,d0
  1050.     or.b    d2,d0
  1051.     move.b    d0,(a1)+
  1052.     dbra    d1,.Y
  1053.     move.l    Window1_Ptr,a0        
  1054.     CALLINT    ViewPortAddress
  1055.     move.l    d0,a0
  1056.     lea.l    ColorBuffer(pc),a1
  1057.     move.l    Depth,d1        
  1058.     moveq.l    #0,d0
  1059.     bset    d1,d0
  1060.     CALLGRAF    LoadRGB4
  1061.     CALLINT    RemakeDisplay
  1062.     bra    IN2
  1063.  
  1064. * How to make ANTIK
  1065. *
  1066. * C=r+g+b    ; add all three parts red, green, blue
  1067. * r=C/3      ; new parts
  1068. * g=C/4
  1069. * b=C/5
  1070.  
  1071. ANTIK    move.l    Window1_Ptr,a0        
  1072.     CALLINT    ViewPortAddress
  1073.     move.l    d0,a0
  1074.     move.l    Depth,d0        ; copy colors to buffer
  1075.     moveq.l    #0,d1
  1076.     bset    d0,d1
  1077.     subq    #1,d1
  1078.     
  1079.     move.l    vp_ColorMap(a0),a0
  1080.     move.l    cm_ColorTable(a0),a0
  1081.     lea.l    ColorBuffer(pc),a1
  1082. .X    move.w    (a0)+,(a1)+
  1083.     dbra    d1,.X
  1084.     
  1085.     move.l    Depth,d0        ; convert colors to b&W
  1086.     moveq.l    #0,d1
  1087.     bset    d0,d1
  1088.     subq    #1,d1
  1089.     lea.l    ColorBuffer(pc),a1
  1090. .Y    moveq.l    #0,d0
  1091.     add.b    (a1),d0
  1092.     moveq.l    #0,d2
  1093.     move.b    1(a1),d2
  1094.     move.b    d2,d3
  1095.     and.b    #$f,d3
  1096.     lsr.b    #4,d2
  1097.     add.b    d2,d0
  1098.     add.b    d3,d0
  1099.     and.l    #$ff,d0
  1100.     move.l    d0,d5
  1101.     divu    #3,d0
  1102.     move.b    d0,(a1)+
  1103.     move.l    d5,d0
  1104.     lsl.w    #2,d0
  1105.     and.w    #$f0,d0
  1106.     divu    #5,d5
  1107.     or.b    d5,d0
  1108.     move.b    d0,(a1)+
  1109.     dbra    d1,.Y
  1110.     move.l    Window1_Ptr,a0        
  1111.     CALLINT    ViewPortAddress
  1112.     move.l    d0,a0
  1113.     lea.l    ColorBuffer(pc),a1
  1114.     move.l    Depth,d1        
  1115.     moveq.l    #0,d0
  1116.     bset    d1,d0
  1117.     CALLGRAF    LoadRGB4
  1118.     CALLINT    RemakeDisplay
  1119.     bra    IN2
  1120.  
  1121.  
  1122. SaveForUndo    move.l    Window1_Ptr,a0        
  1123.     CALLINT    ViewPortAddress
  1124.     move.l    d0,a0
  1125.     move.l    Depth,d0        
  1126.     moveq.l    #0,d1
  1127.     bset    d0,d1
  1128.     cmp.b    #32,d1
  1129.     bls    .Z
  1130.     move.l    #32,d1
  1131. .Z    move.l    d1,UNDODepth
  1132.     subq    #1,d1
  1133.  
  1134.     move.l    vp_ColorMap(a0),a0
  1135.     move.l    cm_ColorTable(a0),a0
  1136.     lea.l    UNDOBuffer(pc),a1
  1137. .X    move.w    (a0)+,(a1)+
  1138.     dbra    d1,.X        
  1139.     rts
  1140.  
  1141. UNDO_ALL    move.l    Window1_Ptr,a0        ; restor save color map        
  1142.     CALLINT    ViewPortAddress
  1143.     move.l    d0,a0
  1144.     lea.l    UNDOBuffer(pc),a1
  1145.     move.l    UNDODepth,d0        
  1146.     CALLGRAF    LoadRGB4
  1147.     CALLINT    RemakeDisplay
  1148.     bra    IN3
  1149.  
  1150.  
  1151. Mode    dc.b    0
  1152. OldMode    dc.b    $ff
  1153.     even
  1154.  
  1155.  
  1156. Title0    dc.b    "XColor 1.2 by RF        ",0
  1157. Title1    dc.b    "Copy to :               ",0
  1158. Title2    dc.b    "Exchange to :           ",0
  1159. Title3    dc.b    "Spread to :             ",0 
  1160.  
  1161. COPY    cmp.b    #1,Mode
  1162.     beq    .Label1
  1163.     move.b    #1,Mode
  1164.     bra    wait
  1165. .Label1    clr.b    Mode
  1166.     bra    wait
  1167.  
  1168. Copy_Color    move.l    Window1_Ptr,a0        
  1169.     CALLINT    ViewPortAddress
  1170.     move.l    d0,a0
  1171.     move.l    vp_ColorMap(a0),a0
  1172.     move.l    cm_ColorTable(a0),a3    ; pointer color map
  1173.  
  1174.     move.w    d6,d0        ; get color        
  1175.     move.w    d7,d1        
  1176.     move.l    Window1_Ptr,a1
  1177.     move.l    wd_RPort(a1),a1
  1178.     CALLGRAF    ReadPixel
  1179.     
  1180.     move.l    d0,d3        ; You can only change colours between 0 and $1f or between $20 and $3f
  1181.     move.l    COLOR,d4
  1182.     and.b    #$20,d3
  1183.     and.b    #$20,d4
  1184.     cmp.b    d3,d4
  1185.     bne    Error
  1186.  
  1187.  
  1188.     and.w    #$1f,d0        ; change colours ( EHB colour-> normal colour) 
  1189.     add.w    d0,d0
  1190.     move.l    COLOR,d1
  1191.     and.w    #$1f,d1
  1192.     add.w    d1,d1
  1193.  
  1194.  
  1195.  
  1196.     move.w    (a3,d1),(a3,d0)    ; copy it !
  1197.     clr.b    Mode
  1198.  
  1199.     CALLINT    RemakeDisplay        
  1200.     bra    IN2
  1201.  
  1202. EXCHANGE    cmp.b    #2,Mode
  1203.     beq    .Label1
  1204.     move.b    #2,Mode
  1205.     bra    wait
  1206. .Label1    clr.b    Mode
  1207.     bra    wait
  1208.  
  1209. Exchange_Color    move.l    Window1_Ptr,a0        
  1210.     CALLINT    ViewPortAddress
  1211.     move.l    d0,a0
  1212.     move.l    vp_ColorMap(a0),a0
  1213.     move.l    cm_ColorTable(a0),a3    ; pointer color map
  1214.  
  1215.     move.w    d6,d0        ; get color        
  1216.     move.w    d7,d1        
  1217.     move.l    Window1_Ptr,a1
  1218.     move.l    wd_RPort(a1),a1
  1219.     CALLGRAF    ReadPixel
  1220.  
  1221.     move.l    d0,d3        ; You can only change colours between 0 and $1f or between $20 and $3f
  1222.     move.l    COLOR,d4
  1223.     and.b    #$20,d3
  1224.     and.b    #$20,d4
  1225.     cmp.b    d3,d4
  1226.     bne    Error
  1227.  
  1228.     and.l    #$1f,d0
  1229.  
  1230.     add.w    d0,d0
  1231.     move.l    COLOR,d1
  1232.     and.l    #$1f,d1
  1233.     add.w    d1,d1
  1234.  
  1235.     move.w    (a3,d1),d2        ; exchange it !
  1236.     move.w    (a3,d0),(a3,d1)
  1237.     move.w    d2,(a3,d0)
  1238.     
  1239.     clr.b    Mode
  1240.  
  1241.     CALLINT    RemakeDisplay        
  1242.     bra    IN2
  1243.  
  1244. SPREAD    cmp.b    #3,Mode
  1245.     beq    .Label1
  1246.     move.b    #3,Mode
  1247.     bra    wait
  1248. .Label1    clr.b    Mode
  1249.     bra    wait
  1250.  
  1251. Spread_Color    move.l    Window1_Ptr,a0        
  1252.     CALLINT    ViewPortAddress
  1253.     move.l    d0,a0
  1254.     move.l    vp_ColorMap(a0),a0
  1255.     move.l    cm_ColorTable(a0),a3    ; pointer color map
  1256.  
  1257.     move.w    d6,d0        ; get color        
  1258.     move.w    d7,d1        
  1259.     move.l    Window1_Ptr,a1
  1260.     move.l    wd_RPort(a1),a1
  1261.     CALLGRAF    ReadPixel
  1262.     move.l    COLOR,d1
  1263.  
  1264. P    cmp.w    d1,d0
  1265.     bls    .L1
  1266.     move.l    d0,d2
  1267.     move.l    d1,d0    
  1268.     move.l    d2,d1
  1269. .L1    move.l    d1,d2
  1270.     sub.l    d0,d2
  1271.     cmp.l    #1,d2
  1272.     bls    .exit
  1273.  
  1274.     move.l    d0,d3    ; You can only change colours between 0 and $1f or between $20 and $3f
  1275.     move.l    d1,d4
  1276.     and.b    #$20,d3
  1277.     and.b    #$20,d4
  1278.     cmp.b    d3,d4
  1279.     bne    Error
  1280.  
  1281.     and.l    #$1f,d0
  1282.     and.l    #$1f,d1
  1283.  
  1284.     move.l    d0,FirstColor
  1285.     move.l    d1,LastColor
  1286.     move.l    d2,DiffColor
  1287.     move.l    d2,d6
  1288.     subq    #2,d6
  1289.  
  1290.     move.l    FirstColor,d0        ;get RGB of first colour 
  1291.     bsr    ReadColorII
  1292.     movem.l    d0-d2,FirstR
  1293.     
  1294.     move.l    LastColor,d0        ;get RGB of last colour 
  1295.     bsr    ReadColorII
  1296.     sub.l    FirstR,d0
  1297.     move.l    d0,DiffR        ; What's the difference ?
  1298.     sub.l    FirstG,d1
  1299.     move.l    d1,DiffG
  1300.     sub.l    FirstB,d2
  1301.     move.l    d2,DiffB
  1302.     
  1303.  
  1304.  
  1305.     moveq.l    #6,d4        ; convert integer to FFP
  1306.     lea.l    FirstR(pc),a3
  1307. .L2    move.l    (a3),d0
  1308.     CALLFFP    SPFlt
  1309.     move.l    d0,(a3)+
  1310.     dbra    d4,.L2
  1311.  
  1312.     lea.l    DiffR,a3
  1313.     lea.l    FaktorR,a4
  1314.  
  1315.     move.l    (a3)+,d0        ; How much R (,G,B)  has to be added each colour ?
  1316.     move.l    DiffColor,d1
  1317.     CALLFFP    SPDiv
  1318.     move.l    d0,(a4)+
  1319.     move.l    (a3)+,d0
  1320.     move.l    DiffColor,d1
  1321.     CALLFFP    SPDiv
  1322.     move.l    d0,(a4)+
  1323.     move.l    (a3)+,d0
  1324.     move.l    DiffColor,d1
  1325.     CALLFFP    SPDiv
  1326.     move.l    d0,(a4)+
  1327.  
  1328. .L3    lea.l    FirstR,a3
  1329.     lea.l    FaktorR,a4
  1330.     lea.l    R_Wert,a5
  1331.     
  1332.     move.l    (a3),d0        ; add to R,G,B
  1333.     move.l    (a4)+,d1
  1334.     CALLFFP    SPAdd
  1335.     move.l    d0,(a3)+
  1336.     CALLFFP    SPFix        ; convert result to integer
  1337.     move.l    d0,(a5)+
  1338.     move.l    (a3),d0
  1339.     move.l    (a4)+,d1
  1340.     CALLFFP    SPAdd
  1341.     move.l    d0,(a3)+
  1342.     CALLFFP    SPFix
  1343.     move.l    d0,(a5)+
  1344.     move.l    (a3),d0
  1345.     move.l    (a4)+,d1
  1346.     CALLFFP    SPAdd
  1347.     move.l    d0,(a3)+
  1348.     CALLFFP    SPFix
  1349.     move.l    d0,(a5)+
  1350.     
  1351.     add.l    #1,FirstColor        ; set colour
  1352.     move.l    FirstColor,d0
  1353.     movem.l    R_Wert,d1-d3
  1354.     bsr    WriteColor
  1355.     dbra    d6,.L3
  1356.  
  1357.     
  1358.     
  1359. .exit    clr.b    Mode
  1360.     CALLINT    RemakeDisplay        ; remake copper list
  1361.     bra    IN2
  1362.  
  1363.  
  1364. FirstR    dc.l    0
  1365. FirstG    dc.l    0
  1366. FirstB    dc.l    0
  1367. DiffR    dc.l    0
  1368. DiffG    dc.l    0
  1369. DiffB    dc.l    0
  1370. DiffColor    dc.l    0    
  1371. FaktorR    dc.l    0
  1372. FaktorG    dc.l    0
  1373. FaktorB    dc.l    0
  1374. FirstColor    dc.l    0
  1375. LastColor    dc.l    0
  1376. ColorNumber    dc.l    0
  1377.  
  1378. R_Wert    dc.l    0
  1379. G_Wert    dc.l    0
  1380. B_Wert    dc.l    0
  1381.     
  1382.  
  1383.  
  1384. ReadColorII    move.l    d0,-(sp)
  1385.     move.l    Window1_Ptr,a0
  1386.     CALLINT    ViewPortAddress
  1387.     move.l    d0,a0
  1388.     move.l    (sp)+,d0
  1389.     move.l    vp_ColorMap(a0),a0
  1390.     and.l    #$1f,d0
  1391.     CALLGRAF    GetRGB4
  1392.     move.b    d0,d1
  1393.     move.b    d0,d2
  1394.     and.l    #$f,d2
  1395.     lsr.b    #4,d1
  1396.     and.l    #$f,d1    
  1397.     lsr.w    #8,d0
  1398.     and.l    #$f,d0
  1399.     rts
  1400.  
  1401. WriteColor    and.w    #$1f,d0
  1402.     move.l    d0,-(sp)
  1403.     move.l    Window1_Ptr,a0
  1404.     CALLINT    ViewPortAddress
  1405.     move.l    d0,a0
  1406.     move.l    (sp)+,d0
  1407.     CALLGRAF    SetRGB4
  1408.     rts
  1409. Error    move.l    CScreen,a0    ; User tried to copy, spread or exchange a normal colour and a EHB colour!
  1410.     CALLINT    DisplayBeep
  1411.     clr.b    Mode
  1412.     bra    wait
  1413.     
  1414.  
  1415.         
  1416.  
  1417.  
  1418.         
  1419.  
  1420.     
  1421.     
  1422.  
  1423.  
  1424.  
  1425.  
  1426.         
  1427.  
  1428.